<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>SmartCarInformationSystem: SmartCarInformationSystem</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">SmartCarInformationSystem
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'搜索','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','搜索');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('md_README.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="PageDoc"><div class="header">
  <div class="headertitle">
<div class="title">SmartCarInformationSystem </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h3><a class="anchor" id="autotoc_md1"></a>
介绍</h3>
<p>重庆大学卓越工程师学院-智能汽车软件-车载软件开发基础-课程实践</p>
<h3><a class="anchor" id="autotoc_md2"></a>
软件架构</h3>
<p>软件架构说明</p>
<h3><a class="anchor" id="autotoc_md3"></a>
编译说明</h3>
<p>项目编译</p><ol type="1">
<li>mkdir build</li>
<li>cd build</li>
<li>cmake ..</li>
<li>make</li>
</ol>
<p>文档编译 </p><blockquote class="doxtable">
<p>doxygen Doxygen.config </p>
</blockquote>
<h3><a class="anchor" id="autotoc_md4"></a>
Doxgen自动生成文档</h3>
<p><a href="doc/html/index.html">生成文档(包含类图、协作图、调用图等等)</a></p>
<h3><a class="anchor" id="autotoc_md5"></a>
整体模块设计</h3>
<p><img src="doc/html/MainServer_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4_cgraph.png" alt="" class="inline"/> 程序入口为MainServer,其通过调用Server层的ManageStudent、ManageSmartCar、ManageCompare来管理学生、智能车、匹配信息，通过调用ShowInfo来调用查看信息。 控制层的StudentController、SmartCarController、CompareController分别用于管理学生、智能车、匹配的实体类。 数据的本地保存通过控制层递归调用实体类的toString()方法，将实例对象输出为格式化字符串，再通过文件流保存到对应数据文件中。数据的读取则为其逆过程。 程序中的ID均通过IdCreater来进行自动管理。</p>
<h3><a class="anchor" id="autotoc_md6"></a>
类设计</h3>
<p><img src="doc/html/MainServer_8cpp__incl.png" alt="" class="inline"/> 智能小车类的设计为了提高程序的灵活性，在类设计时并没有把智能车信息直接设置在类中，而是通过Component及Param的嵌套，一辆智能小车有若干组件，而组件可以有若干属性和若干子组件。 匹配类也是为了满足可能存在的学生对象与智能小车对象的多对多关系而设计的。 为了统一化ID的管理，在可能需要ID的上层会保存IdCreater的指针，这样满足了全局集中式的ID管理。</p>
<h3><a class="anchor" id="autotoc_md7"></a>
关键函数</h3>
<h4><a class="anchor" id="autotoc_md8"></a>
数据保存及数据导入:</h4>
<div class="fragment"><div class="line">std::string Component::toString() {</div>
<div class="line">    std::string str = &quot;component: &quot;;</div>
<div class="line">    str += name + &quot; &quot;;</div>
<div class="line">    str += std::to_string(paramMap.size()) + &quot; &quot;;</div>
<div class="line">    std::unordered_map&lt;std::string,Param*&gt;::iterator iterParam;</div>
<div class="line">    for(iterParam = paramMap.begin();iterParam != paramMap.end(); iterParam++) {</div>
<div class="line">        str += iterParam-&gt;second-&gt;toString() + &quot; &quot;;</div>
<div class="line">    }</div>
<div class="line">    str += std::to_string(subComponentMap.size()) + &quot; &quot;;</div>
<div class="line">    std::unordered_map&lt;std::string,Component*&gt;::iterator iterComponent;</div>
<div class="line">    for(iterComponent = subComponentMap.begin();iterComponent != subComponentMap.end(); iterComponent++) {</div>
<div class="line">        str += iterComponent-&gt;second-&gt;toString() + &quot; &quot;;</div>
<div class="line">    }</div>
<div class="line">    str += &quot;:component&quot;;</div>
<div class="line">    return str;</div>
<div class="line">}</div>
<div class="line"> </div>
<div class="line">std::string Param::toString() {</div>
<div class="line">    std::string str = &quot;param: &quot;;</div>
<div class="line">    str += name + &quot; &quot; + unit + &quot; &quot; + value + &quot; remark: &quot; + remark + &quot; :remark&quot;;</div>
<div class="line">    str += &quot; :param&quot;;</div>
<div class="line">    return str;</div>
<div class="line">}</div>
</div><!-- fragment --><p> 程序中的数据保存通过实体类的toString()函数，将数据转为字符串，进而保存入文件内。 而对于SmartCar-Component-Param则存在嵌套的调用。 </p><div class="fragment"><div class="line">SmartCar* strToSmartCar(std::istringstream &amp;iss);</div>
<div class="line">Component* strToComponent(std::istringstream &amp;iss);</div>
<div class="line">Param* strToParam(std::istringstream &amp;iss);</div>
</div><!-- fragment --><p> 数据的导入则主要为读入一行数据后，将其解析出对象的过程，这里同样使用了strToXXX()的嵌套调用来完成。 </p>
<h4><a class="anchor" id="autotoc_md9"></a>
Id管理</h4>
<div class="fragment"><div class="line">class IdManager {</div>
<div class="line">    private:</div>
<div class="line">        static IdManager* idManager;</div>
<div class="line">        unordered_map&lt;string,IdRegister*&gt; registerCenter;</div>
<div class="line">        IdManager();</div>
<div class="line">        ~IdManager();</div>
<div class="line">    public:</div>
<div class="line">        static void initIdManager();</div>
<div class="line">        static IdManager* getIdManager();</div>
<div class="line">        static void deteleIdManager();</div>
<div class="line">        bool isRegistered(const string &amp;name);</div>
<div class="line">        bool isIdExist(const string &amp;name,const string &amp;id);</div>
<div class="line">        bool registered(const string &amp;name,const string &amp;front,const int length);</div>
<div class="line">        string createId(const string &amp;name);</div>
<div class="line">        bool addId(const string &amp;name,const string &amp;id);</div>
<div class="line">        bool removeId(const string &amp;name,const string &amp;id);</div>
<div class="line">        bool saveData();</div>
<div class="line">        bool loadData();</div>
<div class="line">};</div>
</div><!-- fragment --><p> 在Id管理中，首先需要通过registered函数来注册，这时IdCreater会将ID的格式保持到Register中。在后续创建Id时，则通过注册时的name来获取到Register中的ID格式及统计信息进而产生要求的没有冲突的格式化Id。</p>
<h1><a class="anchor" id="autotoc_md10"></a>
使用说明</h1>
<p><img src="img/1.png" alt="" class="inline"/></p>
<p>这里首先编译项目，产生mainServer可执行文件。</p>
<p><img src="img/2.png" alt="" class="inline"/></p>
<p>执行mainServer则到了总管理界面，这里可以通过输入指令的序号或完整指令来执行指令。</p>
<p><img src="img/3.png" alt="" class="inline"/></p>
<p>这里通过输入1，进入的管理智能小车界面。</p>
<p><img src="img/4.png" alt="" class="inline"/></p>
<p>通过图中流程我们就完成了创建第一辆空白小车，此时小车只有一个自动生成的ID。</p>
<p><img src="img/5.png" alt="" class="inline"/></p>
<p>这里为小车创建了第一个组件：底盘。</p>
<p><img src="img/6.png" alt="" class="inline"/></p>
<p>我们这里选择编辑底盘，可以看到这组件编辑中，可以为底盘创建普通参数，也可以创建组件，还可以创建一个ID。</p>
<p><img src="img/7.png" alt="" class="inline"/></p>
<p>我们这里为底盘创建一个ID，并输入ID的格式要求。</p>
<p><img src="img/8.png" alt="" class="inline"/></p>
<p>这里我们再为底盘创建一个子组件轮胎。</p>
<p><img src="img/9.png" alt="" class="inline"/></p>
<p>然后我们通过多次exit返回到小车管理界面。</p>
<p><img src="img/10.png" alt="" class="inline"/></p>
<p>再次打开创建小车，可以看到此时已经可以通过复制创建新小车啦。</p>
<p><img src="img/11.png" alt="" class="inline"/></p>
<p>可以看到赋值的小车已经创建出来了，并且ID也生成正确。那么这里的底盘的ID有没有实现自动生成而并非简单复制呢？</p>
<p><img src="img/12.png" alt="" class="inline"/></p>
<p>我们退出小车管理，来到信息展示界面，可以看到第二辆小车的底盘ID也按照格式正确生成了。</p>
<p>接下来我们就是完整车辆数据的输入了。</p>
<p><img src="img/13.png" alt="" class="inline"/></p>
<p>这里完成了学生数据的输入</p>
<p><img src="img/14.png" alt="" class="inline"/></p>
<p>然后同样完成了小车完整数据的输入和小车的复制。</p>
<p><img src="img/15.png" alt="" class="inline"/></p>
<p>然后我们就可以到匹配界面去进行匹配了。</p>
<p><img src="img/16.png" alt="" class="inline"/></p>
<p>这里可以看到匹配数据管理中有基本的增删查和自动匹配的功能。</p>
<p>这里是10辆小车分配给12个同学，可以看到这里自动分了2组为二人一组。</p>
<p><img src="img/17.png" alt="" class="inline"/></p>
<p>我们同样可以做小车的详细信息展示看到匹配信息。 </p>
</div></div><!-- contents -->
</div><!-- PageDoc -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">制作者 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </li>
  </ul>
</div>
</body>
</html>
